<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 字面量 =>看见就知道是什么 [],{},''
      const obj = {
        name: 'eee',
      }
      // new Object()
      const obj1 = new Object() // 创建了一个空对象
      obj1.name = '444'
      console.log(obj1)
      const obj2 = new Object({ name: '0000', age: 20 })
      console.log(obj2)
      // 构造函数
      // function 构造函数名(形参1,形参2,形参3) { // 构造函数的形参与对象的普通属性是一般一致的
      //     this.属性名1 = 形参1;
      //     this.属性名2 = 形参2; // 属性的值，一般是通过同名的形参来赋值的
      //     this.属性名3 = 形参3;
      //     this.方法名 = function(){
      //     };
      // }
      // // 调用
      // const obj = new 构造函数名(实参1，实参2，实参3)
      function Person(age) {
        this.name = 'ddd'
        this.age = age
        this.sayHi = function () {
          console.log('哈哈哈')
        }
      }
      const p = new Person(18)
      const p1 = new Person(17)
      console.log(p)
      console.log(p.name)
      p.sayHi()

      // 构造函数 相当于一个模板（雪糕的模具）,可以创建一系列具有相同属性名和方法的对象
      // 实例化：通过构造函数创建对象的这个过程=>new一个对象的过程
      // 实例：创建好的这对象
      // 实例对象是相互独立 互不影响的（一个妈生了多个孩子）

      // 注意点：
      // 1. 构造函数名字首字母一般要大写（为了从视觉上区分构造函数和普通函数）
      // 2. 构造函数里 属性和方法前面必须添加 this
      // 3. 构造函数不需要 return 就可以返回结果（构造函数的返回值即为新创建的对象）
      // 4. 我们调用构造函数 必须使用 new
    </script>
  </body>
</html>
